/*
 * @Author: qiulin_JXGM ql1746365080@gmail.com
 * @Date: 2024-09-02 14:36:56
 * @LastEditors: qiulin_JXGM ql1746365080@gmail.com
 * @LastEditTime: 2024-09-09 13:58:00
 * @FilePath: \SGFEM\DataStructure\FEM\Property\include\PBEAMData.h
 */

#pragma once
#include "DataStructure/Common/DataStructureExport.h"
#include "DataStructure/Common/DataStructureNamespace.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Real.h"
#include "DataStructure/Input/Property/PropertyBase.h"

SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
/** @brief 梁截面属性
 *
 * 直接给定截面属性值
 */
struct DECLSPEC PBEAMData : public PropertyBase
{
    /**
     * @brief    属性数据检查
     * 
     *       area I1 I2 不能为0.0
     * @author   wanghuan
     * @date     2025.01.15
     */
    bool Check () const;

    SG::DataStructure::Common::Id m_mId = 0;  ///< 材料属性Id
    SG::DataStructure::Common::UI64 m_nsges = 1;  ///< 中间截面（intermediate station）定义的个数，恒截面为特殊情况m_nsges为1
    SG::DataStructure::Common::UI64 m_ccf = 0;  ///< m_nsges为1时：AB端截面不同为2，AB截面相同为1；m_nsges非1时，m_ccf=0
    SG::DataStructure::Common::UI64 m_cweld = 0;  ///< 未知

    // 数组中的第一个元素始终为A端属性，最后一个元素始终为B端属性。
    // 每有一个中间截面（intermediate station），依次从第二个元素开始记录
    SG::DataStructure::Common::Real m_SO[11]  = { 0.0 };  ///< 应力输出请求选项
    SG::DataStructure::Common::Real m_XXB[11] = { 0.0 };  ///< 在单元坐标系中到端点A的距离除以单元的长度
    SG::DataStructure::Common::Real m_A[11]   = { 0.0 };  ///< 截面积
    SG::DataStructure::Common::Real m_I1[11]  = { 0.0 };  ///< 惯性矩1
    SG::DataStructure::Common::Real m_I2[11]  = { 0.0 };  ///< 惯性矩2
    SG::DataStructure::Common::Real m_I12[11] = { 0.0 };  ///< 惯性积
    SG::DataStructure::Common::Real m_J[11]   = { 0.0 };  ///< 扭转常数
    SG::DataStructure::Common::Real m_NSM[11] = { 0.0 };  ///< 非结构质量
    ///< 应力恢复中，在单元坐标系中，相对于A端剪心的Y,Z位置，i = 1 相对于 y ，i = 2相对于 z
    SG::DataStructure::Common::Real m_C1[11] = { 0.0 };
    SG::DataStructure::Common::Real m_C2[11] = { 0.0 };
    SG::DataStructure::Common::Real m_D1[11] = { 0.0 };
    SG::DataStructure::Common::Real m_D2[11] = { 0.0 };
    SG::DataStructure::Common::Real m_E1[11] = { 0.0 };
    SG::DataStructure::Common::Real m_E2[11] = { 0.0 };
    SG::DataStructure::Common::Real m_F1[11] = { 0.0 };
    SG::DataStructure::Common::Real m_F2[11] = { 0.0 };

    SG::DataStructure::Common::Real m_K1       = 1.0;  ///< 平面1的剪切刚度因子K
    SG::DataStructure::Common::Real m_K2       = 1.0;  ///< 平面2的剪切刚度因子K
    SG::DataStructure::Common::Real m_S1       = 0.0;  ///< 平面1的锥度引起的剪力释放系数
    SG::DataStructure::Common::Real m_S2       = 0.0;  ///< 平面2的锥度引起的剪力释放系数
    SG::DataStructure::Common::Real m_NSIA     = 0.0;  ///< 非结构质量相对A端重心的单位长度转动惯量
    SG::DataStructure::Common::Real m_NSIB     = 0.0;  ///< 非结构质量相对B端重心的单位长度转动惯量
    SG::DataStructure::Common::Real m_CWA      = 0.0;  ///< A端翘曲系数
    SG::DataStructure::Common::Real m_CWB      = 0.0;  ///< B端翘曲系数
    SG::DataStructure::Common::Real m_M1A      = 0.0;  ///< A端非结构质量重心Y坐标
    SG::DataStructure::Common::Real m_M2A      = 0.0;  ///< A端非结构质量重心Z坐标
    SG::DataStructure::Common::Real m_M1B      = 0.0;  ///< B端非结构质量重心Y坐标
    SG::DataStructure::Common::Real m_M2B      = 0.0;  ///< B端非结构质量重心Z坐标
    SG::DataStructure::Common::Real m_N1A      = 0.0;  ///< A端中性轴重心Y坐标
    SG::DataStructure::Common::Real m_N2A      = 0.0;  ///< A端中性轴重心Z坐标
    SG::DataStructure::Common::Real m_N1B      = 0.0;  ///< B端中性轴重心Y坐标
    SG::DataStructure::Common::Real m_N2B      = 0.0;  ///< B端中性轴重心Z坐标
    SG::DataStructure::Common::Id   m_domainId = 0;
};

/// @brief 判断单元数据是否相等
DECLSPEC bool operator== (const PBEAMData& a, const PBEAMData& b);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE